package com.wsq.coroutine.demo

import kotlinx.coroutines.*

/**
 *
 *Date:2022/5/23
 *Time:16:17
 *author:wushengqi
 */
class CoroutineDemo {
    suspend fun test(){
        System.out.println("挂起函数线程：" + Thread.currentThread().name)
        for (i in 1..3){
            System.out.println("挂起函数打印：" + i)
        }
    }
}

fun main(args:Array<String>){
    demo4()
}


/**
 * 执行顺序：3  1  2  4
 *
 * 用文字描述就是：
 *
 * 先执行runBlocking代码块中的代码，然后执行launch代码块中的代码，最后执行runBlocking代码块外面的代码
 *
 */
fun demo1(){
    runBlocking {
        launch(Dispatchers.IO) {
            //1
            System.out.println("线程名2：" + Thread.currentThread().name)
            delay(10000)
            //2
            val coroutineDemo = CoroutineDemo()
            coroutineDemo.test()

        }

        //3
        System.out.println("线程名1：" + Thread.currentThread().name)
        System.out.println("lalalal")
    }

    //4
    for (i in 1..3){
        System.out.println("主打印：" + i)
    }

    System.out.println("主线程名3：" + Thread.currentThread().name)
}


/**
 * 输出结果：
 *
 * launch代码块外部线程：main
    要开始休眠了
    launch函数线程：DefaultDispatcher-worker-1
    挂起函数线程：DefaultDispatcher-worker-1
    挂起函数打印：1
    挂起函数打印：2
    挂起函数打印：3
 */
fun demo2(){

    System.out.println("launch代码块外部线程：" + Thread.currentThread().name)
    GlobalScope.launch {
        val coroutineDemo = CoroutineDemo()
        System.out.println("launch函数线程：" + Thread.currentThread().name)
//        delay(2000L)
        coroutineDemo.test()
    }
    System.out.println("要开始休眠了")
    Thread.sleep(2000L) // 阻塞主线程 2 秒钟来保证 JVM 存活,如果不操作这一步，将无法执行到协程里面去，因为JVM已经关闭，在Android不需要考虑
}

fun demo3(){
    GlobalScope.launch { // 在后台启动一个新的协程并继续
        println("${Thread.currentThread().name}")
        delay(1000L) // 非阻塞的等待 1 秒钟（默认时间单位是毫秒）
        println("World!") // 在延迟后打印输出
    }
    println("${Thread.currentThread().name}")
    println("Hello,") // 协程已在等待时主线程还在继续
    Thread.sleep(2000L) // 阻塞主线程 2 秒钟来保证 JVM 存活

}

/**
 * 输出：
 *  main 4
 *  DefaultDispatcher-worker-1 3
 *  DefaultDispatcher-worker-2 2
 */
fun demo4():Unit{
    GlobalScope.launch {
        launch {
            for (i in 1..10){
                delay(1000)
                println("${Thread.currentThread().name} 2")
            }
        }
        for (i in 1..10){
            forTest(1000)
        }
    }
    println("${Thread.currentThread().name} 4")

    Thread.sleep(20000L) // 阻塞主线程 2 秒钟来保证 JVM 存活
}

private suspend fun forTest(time:Long){
    delay(1000)
    println("${Thread.currentThread().name} 3")
}
